Align vTPM support in the Xen-API, documentation and lib-xen
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Tue, 30 Jan 2007 14:51:05 +0000 (14:51 +0000)
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Tue, 30 Jan 2007 14:51:05 +0000 (14:51 +0000)
(after the recent changes).

Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
docs/xen-api/xenapi-datamodel.tex
tools/libxen/include/xen_vtpm.h
tools/libxen/src/xen_vtpm.c
tools/python/scripts/xapi.py
tools/python/xen/xend/XendAPI.py
tools/python/xen/xend/XendDomainInfo.py
tools/xm-test/tests/vtpm/09_vtpm-xapi.py

index 42591d57166a12e89c835b22dd2a18c5624ee7d4..e9936df4b1d95c8c8ec014871481777ac1b60bbe 100644 (file)
@@ -10115,38 +10115,6 @@ VM ref
 }
 
 
-value of the field
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~get\_instance}
-
-{\bf Overview:} 
-Get the instance field of the given VTPM.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} int get_instance (session_id s, VTPM ref self)\end{verbatim}
-
-
-\noindent{\bf Arguments:}
-
-\vspace{0.3cm}
-\begin{tabular}{|c|c|p{7cm}|}
- \hline
-{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt VTPM ref } & self & reference to the object \\ \hline 
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:} 
-{\tt 
-int
-}
-
-
 value of the field
 \vspace{0.3cm}
 \vspace{0.3cm}
index e0388ef4cdf7fac45fef0b81b11f1ccd80dd002c..e06b64c33abbfa25e65617756917295560fe5fff 100644 (file)
@@ -196,12 +196,4 @@ xen_vtpm_get_vm(xen_session *session, xen_vm *result, xen_vtpm vtpm);
 extern bool
 xen_vtpm_get_backend(xen_session *session, xen_vm *result, xen_vtpm vtpm);
 
-
-/**
- * Get the instance field of the given VTPM.
- */
-extern bool
-xen_vtpm_get_instance(xen_session *session, int64_t *result, xen_vtpm vtpm);
-
-
 #endif
index 1e56bec56dab2505fe47a5681efe860a10d048da..2b695f6ee2c5340b1c99ed9e948ff0eae756de3a 100644 (file)
@@ -47,9 +47,6 @@ static const struct_member xen_vtpm_record_struct_members[] =
         { .key = "backend",
           .type = &abstract_type_ref,
           .offset = offsetof(xen_vtpm_record, backend) },
-        { .key = "instance",
-          .type = &abstract_type_int,
-          .offset = offsetof(xen_vtpm_record, instance) }
     };
 
 const abstract_type xen_vtpm_record_abstract_type_ =
@@ -182,22 +179,6 @@ xen_vtpm_get_backend(xen_session *session, xen_vm *result, xen_vtpm vtpm)
 }
 
 
-bool
-xen_vtpm_get_instance(xen_session *session, int64_t *result, xen_vtpm vtpm)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = vtpm }
-        };
-
-    abstract_type result_type = abstract_type_int;
-
-    XEN_CALL_("VTPM.get_instance");
-    return session->ok;
-}
-
-
 bool
 xen_vtpm_get_uuid(xen_session *session, char **result, xen_vtpm vtpm)
 {
index f1829e0a1060af31db6955502283c516022152ac..ab0938f111be0fdda2dd8b3a45700bba2ead79d9 100644 (file)
@@ -678,14 +678,6 @@ def xapi_vtpm_create(args, async = False):
     print "Creating vTPM with cfg = %s" % cfg
     vtpm_uuid = execute(server, 'VTPM.create', (session, cfg))
     print "Done. (%s)" % vtpm_uuid
-    vtpm_id = execute(server, 'VTPM.get_instance', (session, vtpm_uuid))
-    print "Has instance number '%s'" % vtpm_id
-    vtpm_be = execute(server, 'VTPM.get_backend', (session, vtpm_uuid))
-    print "Has backend in '%s'" % vtpm_be
-    driver = execute(server, 'VTPM.get_driver', (session, vtpm_uuid))
-    print "Has driver type '%s'" % driver
-    vtpm_rec = execute(server, 'VTPM.get_record', (session, vtpm_uuid))
-    print "Has vtpm record '%s'" % vtpm_rec
 
 
 def xapi_pif_list(args, async = False):
index 354e0d89320f72f20dc5657863d6382d0f4a3f06..0cb40e713320952d577229b8f13bd7dac2439733 100644 (file)
@@ -1735,8 +1735,7 @@ class XendAPI(object):
 
     VTPM_attr_rw = [ ]
     VTPM_attr_ro = ['VM',
-                    'backend',
-                    'instance']
+                    'backend']
 
     VTPM_attr_inst = VTPM_attr_rw
 
@@ -1753,27 +1752,14 @@ class XendAPI(object):
             return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref])
         valid_vtpm_keys = self.VTPM_attr_ro + self.VTPM_attr_rw + \
                           self.Base_attr_ro + self.Base_attr_rw
+        return_cfg = {}
         for k in cfg.keys():
-            if k not in valid_vtpm_keys:
-                del cfg[k]
+            if k in valid_vtpm_keys:
+                return_cfg[k] = cfg[k]
 
-        return xen_api_success(cfg)
+        return xen_api_success(return_cfg)
 
     # Class Functions
-    def VTPM_get_instance(self, session, vtpm_ref):
-        xendom = XendDomain.instance()
-        vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
-        if not vm:
-            return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref])
-        cfg = vm.get_dev_xenapi_config('vtpm', vtpm_ref)
-        if not cfg:
-            return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref])
-        if cfg.has_key('instance'):
-            instance = cfg['instance']
-        else:
-            instance = -1
-        return xen_api_success(instance)
-
     def VTPM_get_backend(self, session, vtpm_ref):
         xendom = XendDomain.instance()
         vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
@@ -1782,11 +1768,9 @@ class XendAPI(object):
         cfg = vm.get_dev_xenapi_config('vtpm', vtpm_ref)
         if not cfg:
             return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref])
-        if cfg.has_key('backend'):
-            backend = cfg['backend']
-        else:
-            backend = "Domain-0"
-        return xen_api_success(backend)
+        if not cfg.has_key('backend'):
+            return xen_api_error(['VTPM backend not set'])
+        return xen_api_success(cfg['backend'])
 
     def VTPM_get_VM(self, session, vtpm_ref):
         xendom = XendDomain.instance()
@@ -1795,12 +1779,18 @@ class XendAPI(object):
 
     def VTPM_destroy(self, session, vtpm_ref):
         xendom = XendDomain.instance()
-        vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
-        if not vm:
-            return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref])
-
-        vm.destroy_vtpm(vtpm_ref)
-        return xen_api_success_void()    
+        dom = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref)
+        if dom:
+            if dom.state != XEN_API_VM_POWER_STATE_HALTED:
+                vm_ref = dom.get_dev_property('vtpm', vtpm_ref, 'VM')
+                return xen_api_error(['VM_BAD_POWER_STATE', vm_ref,
+                 XendDomain.POWER_STATE_NAMES[XEN_API_VM_POWER_STATE_HALTED],
+                 XendDomain.POWER_STATE_NAMES[dom.state]])
+            from xen.xend.server import tpmif
+            tpmif.destroy_vtpmstate(dom.getName())
+            return xen_api_success(True)
+        else:
+            return xen_api_error(['VM_HANDLE_INVALID', vtpm_struct['VM']])
 
     # class methods
     def VTPM_create(self, session, vtpm_struct):
index 4d55e03091b47367193ec40572f42802f34331a9..94c4f4b5c9c878cc71403c0bc5e6d759a2ba4066 100644 (file)
@@ -2125,7 +2125,10 @@ class XendDomainInfo:
                 config['mode'] = 'RW'
 
         if dev_class == 'vtpm':
-            config['driver'] = 'paravirtualised' # TODO
+            if not config.has_type('type'):
+                config['type'] = 'paravirtualised' # TODO
+            if not config.has_key('backend'):
+                config['backend'] = "00000000-0000-0000-0000-000000000000"
 
         return config
 
index 89975d077f472dd785abc64543abc13c7fa6f841..4798dc13c6d8bd4410043dc238441fc18f3b47b3 100644 (file)
@@ -4,14 +4,22 @@
 # Author: Stefan Berger <stefanb@us.ibm.com>
 
 # Test to test the vtpm class through the Xen-API
+#
+# Tested methods:
+#  VTPM: get_uuid, get_backend, get_by_uuid, get_record
+#        create, destroy, get_VM
+#  VM: get_VTPMS
 
 from XmTestLib import xapi
 from XmTestLib.XenAPIDomain import XmTestAPIDomain
 from XmTestLib import *
+from xen.xend import XendDomain
 from vtpm_utils import *
 import commands
 import os
 
+VTPM_RECORD_KEYS = [ 'backend', 'VM', 'uuid' ]
+
 try:
     # XmTestAPIDomain tries to establish a connection to XenD
     domain = XmTestAPIDomain()
@@ -20,52 +28,131 @@ except Exception, e:
 vm_uuid = domain.get_uuid()
 
 vtpmcfg = {}
-vtpmcfg['type'] = "paravirtualised"
-vtpmcfg['backend'] = "Domain-0"
-vtpmcfg['instance'] = 1
+vtpmcfg['backend'] = XendDomain.DOM0_UUID
 vtpmcfg['VM'] = vm_uuid
 
 session = xapi.connect()
 
 vtpm_uuid = session.xenapi.VTPM.create(vtpmcfg)
 
-vtpm_id = session.xenapi.VTPM.get_instance(vtpm_uuid)
 vtpm_be = session.xenapi.VTPM.get_backend(vtpm_uuid)
 if vtpm_be != vtpmcfg['backend']:
     FAIL("vTPM's backend is in '%s', expected: '%s'" %
          (vtpm_be, vtpmcfg['backend']))
 
-driver = session.xenapi.VTPM.get_driver(vtpm_uuid)
-if driver != vtpmcfg['type']:
-    FAIL("vTPM has driver type '%s', expected: '%s'" %
-         (driver, vtpmcfg['type']))
-
 vtpm_rec = session.xenapi.VTPM.get_record(vtpm_uuid)
 
-if vtpm_rec['driver']  != vtpmcfg['type']:
-    FAIL("vTPM record shows driver type '%s', expected: '%s'" %
-         (vtpm_rec['driver'], vtpmcfg['type']))
+miss_keys = []
+for k in VTPM_RECORD_KEYS:
+    if k not in vtpm_rec.keys():
+        miss_keys.append(k)
+if len(miss_keys) > 0:
+    FAIL("vTPM record is missing key(s): %s" % miss_keys)
+
 if vtpm_rec['uuid']  != vtpm_uuid:
     FAIL("vTPM record shows vtpm uuid '%s', expected: '%s'" %
          (vtpm_rec['uuid'], vtpm_uuid))
 if vtpm_rec['VM']  != vm_uuid:
     FAIL("vTPM record shows VM uuid '%s', expected: '%s'" %
          (vtpm_rec['VM'], vm_uuid))
+if vtpm_rec['backend'] != vtpmcfg['backend']:
+    FAIL("vTPM record shows VM bakcned '%s', expected: '%s'" %
+         (vtpm_rev['backend'], vtpmcfg['backend']))
+
+badkeys = []
+keys = vtpm_rec.keys()
+for k in keys:
+    if k not in VTPM_RECORD_KEYS:
+        badkeys.append(k)
+if len(badkeys) > 0:
+    FAIL("Unexpected attributes in result: %s" % badkeys)
+
+if vm_uuid != session.xenapi.VTPM.get_VM(vtpm_uuid):
+    FAIL("VM uuid from VTPM.get_VM different (%s) than expected (%s)." %
+         (vm_ref, vm_uuid))
+
+uuid = session.xenapi.VTPM.get_uuid(vtpm_uuid)
+if uuid != vtpm_uuid:
+    FAIL("vTPM from VTPM.get_uuid different (%s) than expected (%s)." %
+         (uuid, vtpm_uuid))
+
+vtpm_ref = session.xenapi.VTPM.get_by_uuid(vtpm_uuid)
+if vtpm_ref != vtpm_uuid:
+    FAIL("vTPM from VTPM.get_by_uuid different (%s) than expected (%s)." %
+         (vtpm_ref, vtpm_uuid))
+
+vm_vtpms = session.xenapi.VM.get_VTPMs(vm_uuid)
+if len(vm_vtpms) != 1:
+    FAIL("Number of vTPMs from get_VTPMs is (%d) not what was expected (%d)" %
+         (len(vm_vtpms), 1))
+if vtpm_uuid not in vm_vtpms:
+    FAIL("Other vTPM uuid (%s) returned from VM.get_VTPMs than expected (%s)" %
+         (vm_vtpms[0], vtpm_uuid))
 
-success = domain.start()
+try:
+    console = domain.start()
+except DomainError, e:
+    FAIL("Unable to create domain (%s)" % domName)
 
-console = domain.getConsole()
+try:
+    console.sendInput("input")
+except ConsoleError, e:
+    saveLog(console.getHistory())
+    FAIL(str(e))
 
 try:
     run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs")
 except ConsoleError, e:
     saveLog(console.getHistory())
-    vtpm_cleanup(domName)
-    FAIL("No result from dumping the PCRs")
+    FAIL("1. No result from dumping the PCRs")
 
 if re.search("No such file",run["output"]):
-    vtpm_cleanup(domName)
     FAIL("TPM frontend support not compiled into (domU?) kernel")
 
+if not re.search("PCR-00:",run["output"]):
+    saveLog(console.getHistory())
+    FAIL("1. Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"])
+
+try:
+    rc = session.xenapi.VTPM.destroy(vtpm_uuid)
+    #Should never get here
+    FAIL("Could destroy vTPM while VM is running")
+except:
+    pass
+
+rc = session.xenapi.VM.suspend(vm_uuid)
+if rc:
+    FAIL("Could not suspend VM")
+
+try:
+    rc = session.xenapi.VTPM.destroy(vtpm_uuid)
+    #May not throw an exception in 'suspend' state
+except:
+    pass
+
+rc = session.xenapi.VM.resume(vm_uuid, False)
+if rc:
+    FAIL("Could not resume VM")
+
+try:
+    console = domain.getConsole()
+except ConsoleError, e:
+    FAIL(str(e))
+
+try:
+    run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs")
+except ConsoleError, e:
+    saveLog(console.getHistory())
+    FAIL("2. No result from dumping the PCRs. vTPM has been removed?")
+
+if not re.search("PCR-00:",run["output"]):
+    saveLog(console.getHistory())
+    FAIL("2. Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"])
+
 domain.stop()
+
+rc = session.xenapi.VTPM.destroy(vtpm_uuid)
+if not rc:
+    FAIL("Could NOT destroy vTPM while domain is halted.")
+
 domain.destroy()